"""
爬虫思路：
（一）数据来源分析
    1、爬什么？明确需求
        排名、标题、图片、描述

    2、去哪儿爬？找URL
        分析我们要爬的数据是静态的还是动态的（加载方式）
        判断静态数据的方法：源代码Ctrl+U里面有没有（有=静态）
        百度的榜单 = 静态 （找URL容易）
        URL的组成：
        https://top.baidu.com:443/board?tab=realtime


（二）爬虫代码实现（怎么爬）
    1、发送请求
    2、获取数据
        2.1、发送请求
        2.2、解析数据
    3、解析数据
    4、保存数据

"""
import requests
import re
import json

# 1、发送请求
# 2、获取数据
def get_html(url, headers):
    try:
        # 发送请求
        resp = requests.get(url=url, headers=headers)
        # 主动抛出异常
        resp.raise_for_status()
        # 处理编码
        resp.encoding = 'utf-8'
        # 返回请求的文本内容
        return resp.text
    except:
        return None


# 3、解析数据
def parse_html(html):

    # 返回结果列表
    res = []

    # 解析数据的两种思路：
    # 1、搜索（对无结构的字符串进行字符匹配）
    # 2、解析（将一个无结构的字符串，变成一个有结构的对象）
    result = re.findall(r'<!--s-data:(.*?)-->', html, re.S)[0]
    """
        json.loads()
        功能：将一个看上去是json_str变成json_dict
        参数：str
        返回值：dict
    """
    
    """
        findall()
        功能：在字符串中查找符合要求的子串
        参数：1、模式 2、待查找的字符串 3、控制字符
        返回值：一个带有查询结果的列表
    """
    """
        json是什么？JSON（JavaScript Object Notation, JS对象符号）是一种轻量级的数据交换格式。
        json语法：1、引号必须是双引号；2、只有{}对象和[]列表 3、键值对来保存数据
    """
    json_dict = json.loads(result)
    # 字典的取值：1、按键取值 2、for遍历
    data = json_dict['data']
    card = data['cards'][0]
    content = card['content']
    for item in content: 
        dic = {
            'index': item['index'],
            'word': item['word'],
            'desc': item['desc'],
            'img': item['img'],
        }
        res.append(dic)

    return res


# 4、保存数据
def save_data(data):
    # txt保存
    with open('./top_list.txt', 'a') as f:
        for item in data:
            index = item['index']
            word = item['word']
            desc = item['desc']
            img = item['img']
            f.write(str(index)+word+desc+img)

# 主函数
def main():
    url = 'https://top.baidu.com/board?tab=realtime'
    # 爬虫的目的是模拟人（伪装）发送请求获取响应
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/113.0.0.0 Safari/537.36 Edg/113.0.1774.35',
    }
    html = get_html(url, headers)
    if html:
        # 解析数据
        result = parse_html(html)
        if result:
            # 保存数据
            save_data(result)
        else:
            print('解析失败')

    else:
        print('请求失败')

if __name__ == '__main__':
    main()

